/*
    Sketch to generate the setup() calibration values, these are reported
    to the Serial Monitor.

    The sketch has been tested on the ESP8266 and screen with XPT2046 driver.
*/

#include <SPI.h>
#include <TFT_eSPI.h>      // Hardware-specific library

TFT_eSPI tft = TFT_eSPI(); // Invoke custom library

//------------------------------------------------------------------------------------------

void setup() {
    // Use serial port
    Serial.begin(115200);

    // Initialise the TFT screen
    tft.init();

    // Set the rotation before we calibrate
    tft.setRotation(1);

    // Calibrate the touch screen and retrieve the scaling factors
    touch_calibrate();

    /*
        // Replace above line with the code sent to Serial Monitor
        // once calibration is complete, e.g.:
        uint16_t calData[5] = { 286, 3534, 283, 3600, 6 };
        tft.setTouch(calData);
    */

    // Clear the screen
    tft.fillScreen(TFT_BLACK);
    tft.drawCentreString("Touch screen to test!", tft.width() / 2, tft.height() / 2, 2);
}

//------------------------------------------------------------------------------------------

void loop(void) {
    uint16_t x = 0, y = 0; // To store the touch coordinates

    // Pressed will be set true is there is a valid touch on the screen
    boolean pressed = tft.getTouch(&x, &y);

    // Draw a white spot at the detected coordinates
    if (pressed) {
        tft.fillCircle(x, y, 2, TFT_WHITE);
        //Serial.print("x,y = ");
        //Serial.print(x);
        //Serial.print(",");
        //Serial.println(y);
    }
}

//------------------------------------------------------------------------------------------

// Code to run a screen calibration, not needed when calibration values set in setup()
void touch_calibrate() {
    uint16_t calData[5];
    uint8_t calDataOK = 0;

    // Calibrate
    tft.fillScreen(TFT_BLACK);
    tft.setCursor(20, 0);
    tft.setTextFont(2);
    tft.setTextSize(1);
    tft.setTextColor(TFT_WHITE, TFT_BLACK);

    tft.println("Touch corners as indicated");

    tft.setTextFont(1);
    tft.println();

    tft.calibrateTouch(calData, TFT_MAGENTA, TFT_BLACK, 15);

    Serial.println(); Serial.println();
    Serial.println("// Use this calibration code in setup():");
    Serial.print("  uint16_t calData[5] = ");
    Serial.print("{ ");

    for (uint8_t i = 0; i < 5; i++) {
        Serial.print(calData[i]);
        if (i < 4) {
            Serial.print(", ");
        }
    }

    Serial.println(" };");
    Serial.print("  tft.setTouch(calData);");
    Serial.println(); Serial.println();

    tft.fillScreen(TFT_BLACK);

    tft.setTextColor(TFT_GREEN, TFT_BLACK);
    tft.println("Calibration complete!");
    tft.println("Calibration code sent to Serial port.");

    delay(4000);
}

